//
//  BytedCertError.h
//  BytedCert
//
//  Created by LiuChundian on 2019/3/23.
//  Copyright © 2019年 bytedance. All rights reserved.
//

#ifndef BytedCertError_h
#define BytedCertError_h

#import <Foundation/Foundation.h>

typedef NS_ENUM(NSInteger, BytedCertErrorType) {
    BytedCertErrorInit = -100,                    // sdk初始化失败
    BytedCertErrorServer = -1000,                 // 网络错误，详细错误见error信息
    BytedCertErrorUnknown = -1001,                // 未知错误
    BytedCertErrorInterruption = -1002,           // 活体中断
    BytedCertErrorLiveness = -1003,               // 活体检测过程中出现失败
    BytedCertErrorAlgorithmInitFailure = -1004,   // 算法初始化失败
    BytedCertErrorAlgorithmParamsFailure = -1005, // 算法参数设置失败
    BytedCertErrorClickCancel = -1006,            // 用户取消操作
    BytedCertErrorOcrCancel = -1007,              // 用户取消证件识别
    BytedCertErrorRateLimit = -1008,              // 唤起活体页面太频繁
    BytedCertErrorFaceQualityOverTime = -1009,    // 人脸质量检测超时
    BytedCertErrorInterruptionLimit = -1010,      // 中断次数超过限制
    
    BytedCertErrorLivenessMaxTime = -1101, // 超过活体最大次数

    BytedCertErrorArgs = -2000, // 接口请求参数错误

    BytedCertErrorJsonParsing = -3001,      // 数据包解析失败
    BytedCertErrorCameraPermission = -3003, // 无法使用相机，请检查是否打开相机权限
    BytedCertErrorAlbumPermission = -3004,  // 无法使用相册，请检查是否打开相册权限
    BytedCertErrorPickPhoto = -3006,  //相册图片获取失败
    BytedCertErrorTakePhoto = -3007,  //拍照失败
    BytedCertErrorH5Load = -3008,              // H5加载失败
    BytedCertErrorUpdateModelFailure = -5000, // 下载模型失败
    BytedCertErrorNoUpdateModel = -5001,      // 无需更新

    BytedCertErrorNoDownload = -5003, // 还未下载
    BytedCertErrorNoModel = -5004,    // 模型不存在
    BytedCertErrorModelMd5 = -5005,   // md5校验出错
    BytedCertErrorNeedUpdate = -5006, // 需要下载新版本

    BytedCertErrorStillivenessInit = -5010,    //静默初始化失败
    BytedCertErrorStillivenessFailure = -5011, //静默活体失败

    BytedCertErrorVerifyInit = -5020,     // 本地比对初始化失败
    BytedCertErrorVerifyFailrure = -5021, // 比对失败，请确认是本人

    BytedCertErrorTosInfoParseFailure = -6000, // tos信息解析失败
    
    BytedCertErrorVideoLivenessFailure = 7000, // 活体上传失败
    BytedCertErrorVideoVerifyFailrure = 7001,  // 视频比对失败
    
    BytedCertErrorECReqInvalidArgs = 50200, //参数错误
    BytedCertErrorECReqMissingArgs = 50201, //缺少参数
    BytedCertErrorECParseArgs = 50204, //参数类型错误/参数缺失
    BytedCertErrorECImageSizeLimited = 50205, //图像尺寸超过限制
    BytedCertErrorECImageEmpty = 50206, //请求参数中没有获取到图像
    BytedCertErrorECImageDecodeError = 50207, //图像解码错误
    BytedCertVerifyErrorInvalidArgs = 50215, //由于输入的图片、视频、参数等不满足要求，导致认证失败
    BytedCertErrorECAuth = 50400, //权限校验失败，没有接口权限/时间戳参数不正确/签名字段错误
    BytedCertErrorInternal = 50500, //服务器内部错误
    BytedCertErrorImageInvalid = 60301 //输入图片错误
};


@interface BytedCertError : NSObject

/**
 * 错误码，服务端返回
 */
@property (nonatomic, assign, readonly) NSInteger errorCode;

/**
 * 错误信息，可用于页面提示
 */
@property (nonatomic, copy, readonly) NSString *errorMessage;

/**
 * 详细错误码，网络错误
 */
@property (nonatomic, assign, readonly) NSInteger detailErrorCode;

/**
 * 详细错误信息，可用于埋点上报排查问题
 */
@property (nonatomic, copy, readonly) NSString *detailErrorMessage;

/**
 * 原始错误信息
 */
@property (nonatomic, strong, readonly) NSError *oriError;

+ (instancetype)bytedCertErrorWithNetworkError:(NSError *)error;

/// 初始化，无服务端错误码、网络错误码
/// @param errorType 错误码
- (instancetype)initWithType:(BytedCertErrorType)errorType;

/// 初始化，无服务端错误码、网络错误码
/// @param errorType 错误类型
/// @param detailErrorCode 详细错误码
- (instancetype)initWithType:(BytedCertErrorType)errorType detailErrorCode:(NSInteger)detailErrorCode;

/// 初始化，有服务端错误码、可能有网络错误码
/// @param errorCode 错误码
/// @param errorMsg 错误信息
/// @param error 原始错误信息
- (instancetype)initWithErrorCode:(NSInteger)errorCode errorMsg:(NSString *)errorMsg oriError:(NSError *)error;

/// 初始化，只有网络错误码
/// @param errorType 错误码
/// @param error 原始错误信息
- (instancetype)initWithErrorType:(BytedCertErrorType)errorType oriError:(NSError *)error;

+ (NSString *)getErrorMsgByErrorType:(BytedCertErrorType)errorType;

@end

#endif /* BytedCertError_h */
